package br.com.ecomanda.controller;

import java.util.Date;

import br.com.ecomanda.dao.OperacaoComandaDao;
import br.com.ecomanda.enumerations.PermissoesEnum;
import br.com.ecomanda.exceptions.ComandaAbertaMaisDeUmaVezException;
import br.com.ecomanda.exceptions.ComandaJaAbertaException;
import br.com.ecomanda.exceptions.ComandaJaEncerradaException;
import br.com.ecomanda.exceptions.ConexaoComBancoDeDadosException;
import br.com.ecomanda.exceptions.OperacaoComPedidosAbertosException;
import br.com.ecomanda.exceptions.UsuarioSemPermissaoException;
import br.com.ecomanda.locks.OperacaoComandaLock;
import br.com.ecomanda.model.Comanda;
import br.com.ecomanda.model.Funcionario;
import br.com.ecomanda.model.OperacaoComanda;
import br.com.ecomanda.model.Pagamento;

public class OperacaoComandaController extends GenericController {

	private OperacaoComandaDao operacaoComandaDao;

	public OperacaoComandaController(EComandaController parent) throws ConexaoComBancoDeDadosException {
		super(parent);
		operacaoComandaDao = new OperacaoComandaDao();
	}

	public void abrirComanda(Comanda comanda, Funcionario funcionario)
			throws ComandaJaAbertaException, ComandaAbertaMaisDeUmaVezException {

		synchronized (OperacaoComandaLock.getInstance()) {
			if (getOperacaoAberta(comanda) != null)
				throw new ComandaJaAbertaException();

			OperacaoComanda novaOperacao = new OperacaoComanda();
			novaOperacao.setComanda(comanda);
			novaOperacao.setDtAbertura(new Date());
			novaOperacao.setFuncionario1(funcionario);

			operacaoComandaDao.save(novaOperacao);
		}

	}

	public void encerrarComanda(Comanda comanda, Funcionario funcionario,
			Pagamento pagamento) throws ComandaJaEncerradaException,
			UsuarioSemPermissaoException, ComandaAbertaMaisDeUmaVezException,
			OperacaoComPedidosAbertosException {

		synchronized (OperacaoComandaLock.getInstance()) {
			OperacaoComanda operacaoComanda = getOperacaoAberta(comanda);

			if (operacaoComanda == null)
				throw new ComandaJaEncerradaException();
			
			if (pagamento == null)
				if (!FuncionarioController.permissao(funcionario, PermissoesEnum.ENCERRAR_SEM_PAGAMENTO))
					throw new UsuarioSemPermissaoException(
							"Encerrar Comanda sem Registrar Pagamento");
			
			System.out.println( parent.getPedidoController() != null );

			if (parent.getPedidoController().contemPedidosAbertos(operacaoComanda))
				throw new OperacaoComPedidosAbertosException();

			operacaoComanda.setDtEncerramento(new Date());
			operacaoComanda.setFuncionario2(funcionario);
			if( pagamento != null )
				operacaoComanda.setPagamento(pagamento);

			operacaoComandaDao.update(operacaoComanda);
		}

	}

	public OperacaoComanda getOperacaoAberta(Comanda comanda)
			throws ComandaAbertaMaisDeUmaVezException {

		synchronized (OperacaoComandaLock.getInstance()) {
			return operacaoComandaDao.getOperacaoAberta(comanda);
		}

	}

}
